﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Medianamik.Core.Urls
{
    public class UrlDictionaryLoader
    {
        public List<IUrlDictionaryEntry> Load()
        {
            //Charger le dictionnaire
            List<IUrlDictionaryEntry> entries = null; 

            //On exécute le remplissage de la collection dans un thread car c'est lourd et on n'a pas que ça à faire !
            Thread fillCollectionThread = new Thread(() =>ConfigManager.GetUrlDictionaryEntries().ToList());
            fillCollectionThread.Start();


            var websitesInstances = (from website in ConfigManager.GetAll<WebSite>()
                                     from instance in website.Instances
                                     select new
                                     {
                                         DefaultDocument = instance["DefaultDocument"].GetValue<Guid?>(),
                                         Prefix = instance["Prefix"].GetValue<string>(),
                                         NodeId = instance.Node.ID,
                                         CultureName = instance.Culture.Name,
                                     }).ToList();

            var langs = ConfigManager.GetEditionCultures().ToList();


            //Maintenant on a besoin de la collection d'URLs donc on attend le Thread;
            fillCollectionThread.Join();

            //Ajout des documents par defaut
            var defaultDocs = (from entry in entries.Cast<UrlDictionaryEntry>()
                               join wi in websitesInstances on entry.NodeId equals wi.DefaultDocument
                               where string.Equals(entry.Culture.Name, wi.CultureName, StringComparison.InvariantCultureIgnoreCase)
                               where Guid.Equals(wi.NodeId, entry.WebsiteId)
                               select new UrlDictionaryEntry(wi.DefaultDocument.Value, wi.NodeId, entry.Culture, entry.Revision, entry.Generation, entry.Scheme, entry.Domain, entry.DomainGroup, wi.Prefix, "/", entry.RewritedPath))
                       .ToList();

            //Ok on a la liste des documents par défaut mais attention
            //il peut exister deux fois la meme URL par défaut pour deux langues différentes
            //quand le préfixe du website est identique dans les deux langues
            //Il faut donc ordonner la liste en fonction de la priorité des langues dans Medianamik
            var orderedDocs = defaultDocs.Where(d => langs.Any(l => l.CultureInfo == d.Culture))
                .Select(d => new
                {
                    Doc = d,
                    Position = langs.First(l => l.CultureInfo == d.Culture).Position
                })
                .OrderBy(d => d.Position)
                .Select(d => d.Doc);

            
            foreach (var doc in orderedDocs)
            {
                if (!entries.Exists(e=>e.RequestedUrl == doc.RequestedUrl))
                {
                    entries.Add(doc);
                }
            }

            return entries;
        }
    }
}
